@[toc]
前言
Lua 是一种轻量小巧的脚本语言,用标准C语言编写,并开源。
其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua 是巴西里约热内卢天主教大学里的一个研究小组(由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成)于1993年开发。
只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
提供多线程(协同进程,并非操作系统所支持的线程)支持;
p s:协同进程内部发起http请求的时候会导致设备卡死
- 基础常用功能: iPhone自动解锁
- lua 发起的Content-Type 为application/json; charset=UTF-8的请求 的GitHub源码
- 使用Lua的协同程序来完成生产者-消费者这一经典问题
I、基础常用功能
- iPhone自动解锁
init("0", 0);
require "TSLib"
while (true) do
if deviceIsLock() == 1 then --判断设备是否锁定
unlockDevice()--解锁无密码的设备
end
end
- 遍历打印table的两种方式
if type(response_body) == "table" then
for k, v in pairs(response_body) do
-- print( v)
-- print( type(v))
str2 = v
end
end
if type(response_body) == "table" then
sysLog("《"..table.concat(response_body).."》")
else
sysLog("Not a table:", type(response_body))
end
- 获取点坐标以及对应的颜色
x,y = catchTouchPoint();
sysLog("catchTouchPoint"..x..","..y);
r,g,b = getColorRGB(x,y);
sysLog("getColor:"..r..","..g..","..b);
- lua 请求不走wifi 的代理,, 只能设置设备的hosts
iPhone:/etc root# echo "192.168.2.254 alimama.fuge.cn" > /etc/hosts
iPhone:/etc root# echo '127.0.0.1 localhost' >> /etc/hosts
II、生产者-消费者问题
现在我就使用Lua的协同程序来完成生产者-消费者这一经典问题。
生产者-消费者问题
现在我就使用Lua的协同程序来完成生产者-消费者这一经典问题。
local newProductor
function productor()
local i = 0
while true do
i = i + 1
send(i) -- 将生产的物品发送给消费者
end
end
function consumer()
while true do
local i = receive() -- 从生产者那里得到物品
print(i)
end
end
function receive()
local status, value = coroutine.resume(newProductor)
return value
end
function send(x)
coroutine.yield(x) -- x表示需要发送的值,值返回以后,就挂起该协同程序
end
-- 启动程序
newProductor = coroutine.create(productor)
consumer()
适用于 执行一个任务(生产),上报数据给服务端(消费),开启下一个任务的场景。
生产一次,消费一次。
III Http4lua
- lua 发起的Content-Type 为application/json; charset=UTF-8的请求的封装: httpPostJson
--local json = require "json"
local sz = require("sz")
local json = sz.json
local http = require("szocket.http")
require "TSLib"
local globalIOS8 = -1
local globalIOS9 = -1
function isiOS8()
if globalIOS8 == -1 then
if string.byte( osversion ,1) == string.byte( "8" ,1) then
globalIOS8 = 1
else
globalIOS8 = 0
end
end
return globalIOS8 == 1
end
function isiOS9()
if globalIOS9 == -1 then
if string.byte( osversion ,1) == string.byte( "9" ,1) then
globalIOS9 = 1
else
globalIOS9 = 0
end
end
return globalIOS9 == 1
end
function isiOS10()
return isiOS8() == false and isiOS9() == false
end
w,h = getScreenSize()
function clearDeviceData(...)
clearPasteboard()--清除设备剪贴板信息
clearCookies() --清除浏览器Cookies信息
end
function click2(pt)
touchDown(pt.x, pt.y)
mSleep(60)
touchUp(pt.x, pt.y)
end
function click(x, y)
touchDown(x, y)
mSleep(60)
touchUp(x, y)
end
function findMultiColorInRect( colorTable , rc )
x,y=findMultiColorInRegionFuzzyByTable(colorTable,90, rc.x1 , rc.y1 , rc.x2 , rc.y2 )
return x,y
end
function findMultiColorInRectBool( colorTable , rc )
x,y=findMultiColorInRegionFuzzyByTable(colorTable,90, rc.x1 , rc.y1 , rc.x2 , rc.y2 )
if x ~= -1 and y ~= -1 then
return true
else
return false
end
end
--return handled
function findAndClick( colorTable , rc )
x,y= findMultiColorInRect( colorTable , rc)
if x ~= -1 and y ~= -1 then
mSleep(500)
click(x,y)
return true
else
return false
end
end
local myToken = "dinghao"
function httpPost( http_url , content_type , http_body )
sysLog("《httpPost start 》http_url: "..http_url);
sysLog("content_type: "..content_type);
sysLog("http_body :")
if type(http_body) == "table" then
sysLog(table.concat(http_body))
else
if(not(http_body == nil)) then
sysLog("Not a table:"..http_body)
end
end
local response_body = {}
local res, code, response_headers = http.request{
url = http_url,
method = "POST",
headers =
{
["Content-Type"] = content_type;
["Content-Length"] = #http_body;
},
source = ltn12.source.string(http_body),
sink = ltn12.sink.table(response_body),
}
decode3 = {};
--notifyMessage("res is:"..res);
sysLog("《httpPost end 》");
if(not(res == nil)) then
sysLog("res:"..res);
else
--code: timeout
res= "";
sysLog("code: "..code);
--输出返回的信息到特定文件
-- 以附加的方式打开只写文件
file = io.open("/var/root/lualog.text", "a")
-- 在文件最后一行添加 Lua 注释
-- 设置默认输出文件为 test.lua
io.output(file)
if type(response_body) == "table" then
file:write("--res:"..res.." code:"..code.." response_body:"..table.concat(response_body).."\n")
else
file:write("--res:"..res.." code:"..code.." response_body[1]:"..type(response_body).."\n")
end
-- 关闭打开的文件
file:close()
return res,code,decode3
end
sysLog("code: "..code);
sysLog("Response body:")
if type(response_body) == "table" then
sysLog("《"..table.concat(response_body).."》")
else
sysLog("Not a table:", type(response_body))
end
if (not(response_body[1] == nil)) then
decode3 = json.decode( response_body[1] )--第一个元素是string
end
return res,code,decode3
end
function httpPostJson(http_url , json_body_table )
assert( type(json_body_table) == "table" )
return httpPost(http_url,"application/json; charset=UTF-8", json.encode( json_body_table ) )
end
local globalURL = ""
local smsStatusProcessing = 2
local smsStatusFailed = 3
local smsStatusFinished = 4
- httpPostJson的使用例子:
local postTable = {};
--测试网站
local res,code,response_body = httpPostJson(urlTable["getNew"], postTable);
--notifyMessage("res is:"..res);
sysLog("response_body "..table.concat(response_body));
sysLog(res)
sysLog("Response body:")
if type(response_body) == "table" then
sysLog(table.concat(response_body))
else
sysLog("Not a table:", type(response_body))
end
--send("timeout") -- 将生产的物品发送给消费者,告诉后台转换超时
send(table.concat(response_body)) -- 将生产的物品发送给消费者
writePasteboard(code);
- 通过封装的 httpPostJson请求上报数据
- function KNreport(report)
if not(type(report) == "table") then
return;
end
getnewurl = ""..urlbaseTable[getenv()]..methodurlTable["report"];
local res,code,response_body = httpPostJson(getnewurl, report);
--send("timeout") --
--send() --
local jsonBody= response_body;
sysLog("jsonBody :"..table.concat(response_body));
code = jsonBody["Code"];
sysLog("Code:"..code.."type"..type(Code)); --break;
if( code == 201 ) then
sysLog("201:"); --break;
elseif (code == 200 ) then
sysLog("上报成功!"); --break;
end
end
see also
多行注释推荐使用 --[=[注释内容]=]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。